#include "io_driver.h"
#include "uln.h"
#include "opto_input.h"
// 根据实际硬件连接情况，修改以下引脚定义

enum
{
    NT75_RELAY_CH_1=ULN1_10,  // Connected to ULN1_10
    NT75_RELAY_CH_2=ULN1_11,  // Connected to ULN1_11
    NT75_RELAY_CH_3=ULN1_12,  // Connected to ULN1_12
    NT75_RELAY_CH_4=ULN1_13,  // Connected to ULN1_13
    NT75_RELAY_CH_5=ULN1_14,  // Connected to ULN1_14
    NT75_RELAY_CH_6=ULN1_15,  // Connected to ULN1_15
    NT75_RELAY_CH_7=ULN1_16,  // Connected to ULN1_16
    NT75_RELAY_CH_8=ULN2_10,  // Connected to ULN2_10
    NT75_RELAY_CH_9=ULN2_11,  // Connected to ULN2_11

    NT90_RELAY_CH_01=ULN3_10,
    NT90_RELAY_CH_02=ULN3_11,

    FX202_RELAY_CH_01=ULN2_12,
    FX202_RELAY_CH_02=ULN2_13,
    FX202_RELAY_CH_03=ULN2_14,
    FX202_RELAY_CH_04=ULN2_15,
    FX202_RELAY_CH_05=ULN2_16,
    FX202_RELAY_CH_06=ULN3_12,
    FX202_RELAY_CH_07=ULN3_13,
    FX202_RELAY_CH_08=ULN3_14,
    FX202_RELAY_CH_09=ULN3_15,
    FX202_RELAY_CH_10=ULN3_16,
    FX202_RELAY_CH_11=ULN4_16,
    
    FX303_RELAY_CH_01=ULN5_16,
    FX303_RELAY_CH_02=ULN5_15,
    FX303_RELAY_CH_03=ULN5_14,
    FX303_RELAY_CH_04=ULN5_13,
    FX303_RELAY_CH_05=ULN5_12,
    FX303_RELAY_CH_06=ULN5_11,
    FX303_RELAY_CH_07=ULN4_15,
    FX303_RELAY_CH_08=ULN4_14,
    FX303_RELAY_CH_09=ULN4_13,
    FX303_RELAY_CH_10=ULN4_12,
    FX303_RELAY_CH_11=ULN4_11,
    FX303_RELAY_CH_12=ULN4_10,
};

// 输出引脚定义
const IO_Pin_TypeDef Y0_PIN=NT75_RELAY_CH_1 ;    // 顶料1控制
const IO_Pin_TypeDef Y1_PIN=NT75_RELAY_CH_2;    // 顶料2控制
const IO_Pin_TypeDef Y2_PIN=NT75_RELAY_CH_3 ;    // 顶料3控制
const IO_Pin_TypeDef TOPPING_PIN[3]={NT75_RELAY_CH_1,NT75_RELAY_CH_2,NT75_RELAY_CH_3};

const IO_Pin_TypeDef Y3_PIN=NT75_RELAY_CH_4;    // 果酱1控制
const IO_Pin_TypeDef Y4_PIN=NT75_RELAY_CH_5;    // 果酱2控制
const IO_Pin_TypeDef Y5_PIN=NT75_RELAY_CH_6;    // 果酱3控制
const IO_Pin_TypeDef JAM_PIN[3]={NT75_RELAY_CH_4,NT75_RELAY_CH_5,NT75_RELAY_CH_6};
const IO_Pin_TypeDef Y6_PIN=NT75_RELAY_CH_7;    // 落杯电机控制
const IO_Pin_TypeDef Y8_PIN=NT75_RELAY_CH_9 ;    // 膨化泵控制

const IO_Pin_TypeDef Y14_PIN =NT90_RELAY_CH_01;  // 主压机控制
const IO_Pin_TypeDef Y15_PIN=NT90_RELAY_CH_02;  // 主电机控制

const IO_Pin_TypeDef Y16_PIN= FX202_RELAY_CH_06;   // 预冷电磁阀控制
const IO_Pin_TypeDef Y17_PIN=FX202_RELAY_CH_07;   // 制冷电磁阀控制
const IO_Pin_TypeDef Y19_PIN=FX202_RELAY_CH_09;   // 制热电磁阀控制

const IO_Pin_TypeDef Y21_PIN=FX202_RELAY_CH_11 ;   // 杀菌灯控制

// X轴步进电机控制引脚
const IO_Pin_TypeDef X_DIR_PIN=ULN6_16 ;  // X轴方向正向
const IO_Pin_TypeDef X_PUL_PIN=ULN6_15 ;  // X轴脉冲正向


// Y轴步进电机控制引脚
const IO_Pin_TypeDef Y_DIR_PIN ;  // Y轴方向正向
const IO_Pin_TypeDef Y_PUL_PIN ;  // Y轴脉冲正向

// Z轴步进电机控制引脚
const IO_Pin_TypeDef Z_DIR_PIN =ULN6_14;  // Z轴方向正向
const IO_Pin_TypeDef Z_PUL_PIN =ULN6_13; // Z轴脉冲正向

// 提升电机控制引脚
const IO_Pin_TypeDef LIFT_PLUS_PIN=FX303_RELAY_CH_11 ;   // 提升电机上升
const IO_Pin_TypeDef LIFT_MINUS_PIN =FX303_RELAY_CH_12;  // 提升电机下降

// 电动门机控制引脚
const IO_Pin_TypeDef DOOR_PLUS_PIN=FX303_RELAY_CH_05 ;   // 电动门开门
const IO_Pin_TypeDef DOOR_MINUS_PIN=FX303_RELAY_CH_06 ;  // 电动门关门


// 输入引脚定义
const IO_Pin_TypeDef X0_PIN =OPTO_IN_CH_0;   // X轴原点
const IO_Pin_TypeDef X1_PIN=OPTO_IN_CH_1;   // Z轴原点

const IO_Pin_TypeDef X4_PIN= OPTO_IN_CH_4;   // 落杯1位置
const IO_Pin_TypeDef X7_PIN=OPTO_IN_CH_7 ;   // 杯子检测
const IO_Pin_TypeDef X9_PIN=OPTO_IN_CH_9;   // 浮球欠料
const IO_Pin_TypeDef X11_PIN=OPTO_IN_CH_11; // 对射信号
const IO_Pin_TypeDef X12_PIN=OPTO_IN_CH_12 ; // 夹手开关



// 其他引脚定义...（根据实际硬件连接补充）

void io_driver_init()
{
    opto_input_init();
    uln_init();



}
void IO_SET(const IO_Pin_TypeDef pin)      
{
    uln_set_channel(pin,0);
}
void IO_RESET(const IO_Pin_TypeDef pin)   
{
    uln_set_channel(pin,1);
}
int IO_READ(const IO_Pin_TypeDef pin)      
{
  return  opto_input_read_channel(pin);

}